import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  ManyToOne,
  JoinColumn,
  Index,
} from 'typeorm'
import { User } from 'src/modules/user/entities/user.entity'

/**
 * 文件实体
 * 用于存储文件的基本信息、元数据和权限控制
 */
@Entity('va_files')
@Index(['filename', 'uploaderId']) // 文件名和上传者索引
@Index(['mimeType']) // MIME类型索引
@Index(['createdAt']) // 创建时间索引
export class File {
  @PrimaryGeneratedColumn()
  id: number

  /**
   * 原始文件名
   */
  @Column({ type: 'varchar', length: 255 })
  originalName: string

  /**
   * 存储文件名（UUID生成，避免冲突）
   */
  @Column({ type: 'varchar', length: 255, unique: true })
  filename: string

  /**
   * 文件扩展名
   */
  @Column({ type: 'varchar', length: 20 })
  extension: string

  /**
   * MIME类型
   */
  @Column({ type: 'varchar', length: 100 })
  mimeType: string

  /**
   * 文件大小（字节）
   */
  @Column({ type: 'bigint' })
  size: number

  /**
   * 文件存储路径
   */
  @Column({ type: 'varchar', length: 500 })
  path: string

  /**
   * 文件访问URL
   */
  @Column({ type: 'varchar', length: 500, nullable: true })
  url: string

  /**
   * 文件哈希值（用于去重和完整性校验）
   */
  @Column({ type: 'varchar', length: 64, nullable: true })
  hash: string

  /**
   * 文件状态：pending, uploaded, processing, completed, error
   */
  @Column({ type: 'varchar', length: 20, default: 'pending' })
  status: string

  /**
   * 文件类型分类：image, video, audio, document, archive, other
   */
  @Column({ type: 'varchar', length: 20, default: 'other' })
  category: string

  /**
   * 文件标签（JSON格式）
   */
  @Column({ type: 'json', nullable: true })
  tags: string[]

  /**
   * 文件描述
   */
  @Column({ type: 'text', nullable: true })
  description: string

  /**
   * 是否公开访问
   */
  @Column({ type: 'boolean', default: false })
  isPublic: boolean

  /**
   * 访问权限（JSON格式）
   */
  @Column({ type: 'json', nullable: true })
  permissions: {
    read: number[] // 可读用户ID列表
    write: number[] // 可写用户ID列表
    delete: number[] // 可删除用户ID列表
  }

  /**
   * 下载次数
   */
  @Column({ type: 'int', default: 0 })
  downloadCount: number

  /**
   * 最后访问时间
   */
  @Column({ type: 'timestamp', nullable: true })
  lastAccessedAt: Date

  /**
   * 上传者ID
   */
  @Column()
  uploaderId: number

  /**
   * 上传者信息
   */
  @ManyToOne(() => User, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'uploaderId' })
  uploader: User

  /**
   * 创建时间
   */
  @CreateDateColumn({ type: 'timestamp' })
  createdAt: Date

  /**
   * 更新时间
   */
  @UpdateDateColumn({ type: 'timestamp' })
  updatedAt: Date
}
